/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package nl.hanze.shoestring.domain;

import java.io.Serializable;
import java.util.Date;
import java.util.List;
import javax.persistence.*;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;

/**
 *
 * @author qrazi
 */
@Entity
@Table(name = "persoon")
@XmlRootElement
@NamedQueries({
	@NamedQuery(name = "Persoon.findAll", query = "SELECT p FROM Persoon p"),
	@NamedQuery(name = "Persoon.findById", query = "SELECT p FROM Persoon p WHERE p.id = :id"),
	@NamedQuery(name = "Persoon.findByAchternaam", query = "SELECT p FROM Persoon p WHERE p.achternaam = :achternaam"),
	@NamedQuery(name = "Persoon.findByVoornaam", query = "SELECT p FROM Persoon p WHERE p.voornaam = :voornaam"),
	@NamedQuery(name = "Persoon.findByAdres", query = "SELECT p FROM Persoon p WHERE p.adres = :adres"),
	@NamedQuery(name = "Persoon.findByPostcode", query = "SELECT p FROM Persoon p WHERE p.postcode = :postcode"),
	@NamedQuery(name = "Persoon.findByWoonplaats", query = "SELECT p FROM Persoon p WHERE p.woonplaats = :woonplaats"),
	@NamedQuery(name = "Persoon.findByTelefoon", query = "SELECT p FROM Persoon p WHERE p.telefoon = :telefoon"),
	@NamedQuery(name = "Persoon.findByEmail", query = "SELECT p FROM Persoon p WHERE p.email = :email"),
	@NamedQuery(name = "Persoon.findByGeboortedatum", query = "SELECT p FROM Persoon p WHERE p.geboortedatum = :geboortedatum"),
	@NamedQuery(name = "Persoon.findByGeslacht", query = "SELECT p FROM Persoon p WHERE p.geslacht = :geslacht"),
	@NamedQuery(name = "Persoon.findByRekeningnummer", query = "SELECT p FROM Persoon p WHERE p.rekeningnummer = :rekeningnummer")})
public class Persoon implements Serializable, Comparable {
	private static final long serialVersionUID = 1L;
	@Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @NotNull
    @Column(name = "id")
	private Integer id;
	@Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 45)
    @Column(name = "achternaam")
	private String achternaam;
	@Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 45)
    @Column(name = "voornaam")
	private String voornaam;
	@Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 45)
    @Column(name = "adres")
	private String adres;
	@Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 45)
    @Column(name = "postcode")
	private String postcode;
	@Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 45)
    @Column(name = "woonplaats")
	private String woonplaats;
	@Size(max = 45)
    @Column(name = "telefoon")
	private String telefoon;
	// @Pattern(regexp="[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?", message="Invalid email")//if the field contains email address consider using this annotation to enforce field validation
	@Size(max = 128)
    @Column(name = "email")
	private String email;
	@Basic(optional = false)
    @NotNull
    @Column(name = "geboortedatum")
    @Temporal(TemporalType.TIMESTAMP)
	private Date geboortedatum;
	@Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 2)
    @Column(name = "geslacht")
	private String geslacht;
	@Basic(optional = false)
    @NotNull
    @Column(name = "rekeningnummer")
	private int rekeningnummer;
	@OneToOne(cascade = CascadeType.ALL, mappedBy = "persoon")
    private Klant klant;
    @OneToOne(cascade = CascadeType.ALL, mappedBy = "persoon")
    private Medewerker medewerker;

	public Persoon() {
	}

	public Persoon(Integer id) {
		this.id = id;
	}

	public Persoon(Integer id, String achternaam, String voornaam, String adres, String postcode, String woonplaats, Date geboortedatum, String geslacht, int rekeningnummer) {
		this.id = id;
		this.achternaam = achternaam;
		this.voornaam = voornaam;
		this.adres = adres;
		this.postcode = postcode;
		this.woonplaats = woonplaats;
		this.geboortedatum = geboortedatum;
		this.geslacht = geslacht;
		this.rekeningnummer = rekeningnummer;
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getAchternaam() {
		return achternaam;
	}

	public void setAchternaam(String achternaam) {
		this.achternaam = achternaam;
	}

	public String getVoornaam() {
		return voornaam;
	}

	public void setVoornaam(String voornaam) {
		this.voornaam = voornaam;
	}

	public String getAdres() {
		return adres;
	}

	public void setAdres(String adres) {
		this.adres = adres;
	}

	public String getPostcode() {
		return postcode;
	}

	public void setPostcode(String postcode) {
		this.postcode = postcode;
	}

	public String getWoonplaats() {
		return woonplaats;
	}

	public void setWoonplaats(String woonplaats) {
		this.woonplaats = woonplaats;
	}

	public String getTelefoon() {
		return telefoon;
	}

	public void setTelefoon(String telefoon) {
		this.telefoon = telefoon;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public Date getGeboortedatum() {
		return geboortedatum;
	}

	public void setGeboortedatum(Date geboortedatum) {
		this.geboortedatum = geboortedatum;
	}

	public String getGeslacht() {
		return geslacht;
	}

	public void setGeslacht(String geslacht) {
		this.geslacht = geslacht;
	}

	public int getRekeningnummer() {
		return rekeningnummer;
	}

	public void setRekeningnummer(int rekeningnummer) {
		this.rekeningnummer = rekeningnummer;
	}
	
	@XmlTransient
	public Klant getKlant() {
		return klant;
	}
	
	public void setKlant(Klant klant){
		this.klant = klant;
	}
	
	@XmlTransient
	public Medewerker getMedewerker(){
		return medewerker;
	}
	
	public void setMedewerker(Medewerker medewerker){
		this.medewerker = medewerker;
	}
	
	@Override
	public int hashCode() {
		int hash = 0;
		hash += (id != null ? id.hashCode() : 0);
		return hash;
	}

	@Override
	public boolean equals(Object object) {
		// TODO: Warning - this method won't work in the case the id fields are not set
		if (!(object instanceof Persoon)) {
			return false;
		}
		Persoon other = (Persoon) object;
		if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
			return false;
		}
		return true;
	}

	@Override
	public String toString() {
		return getAchternaam();
	}

    @Override
    public int compareTo(Object o) {
        Persoon other  = (Persoon) o;
        return this.getAchternaam().compareTo(other.getAchternaam());
    }

	
        
        
}
